/*!
 * jQuery limitnumeral plugin
 *
 * 限制只能输入数字插件
 * 
 * Usage: $('.limitInput').limitnumeral();
 * Author: rttianqingsen@huawei.com
 */
(function(jQuery, undef){ 

	// ----------------------------------------------------------------------------
    //-----------------------------扩展的插件方法----------------------------
    //----------------------------------------------------------------------------  
    var docloaded = false; // 确保HTML加载完毕
    jQuery(document).ready(function() {docloaded = true;} );
    
    /**
     * 该插件的主方法
     */
    jQuery.fn.limitnumeral = function(settings) {
        return this.each(function() {
            if (!docloaded) {
                $(document).ready(function() {
                    jQuery.fn.limitnumeral.init(this, settings);
                });
            } else {
                jQuery.fn.limitnumeral.init(this, settings);
            }
        });
    };
    
    /* Default Settings */ 
    jQuery.fn.limitnumeral.defaults = {
        isFloat: false,             // 是否支持小数
        isNegative: false           // 是否支持负数 
    };
    jQuery.fn.limitnumeral.settings = {};
    
    // 受控按键
    var controlKeyCode = {
		BACKSPACE: 8, 
		TAB: 9, 
		ENTER: 13,
		SHIFT: 16,
		CONTROL: 17,
		// CAPS_LOCK: 20, 
		ESCAPE: 27, 
		// SPACE: 32, 
		PAGE_UP: 33, 
		PAGE_DOWN: 34, 
		END: 35, 
		HOME: 36, 
		LEFT: 37, 
		UP: 38,
		RIGHT: 39, 
		DOWN: 40, 
		INSERT: 45, 
		DELETE: 46, 
		// NUMPAD_MULTIPLY: 106, 
		// NUMPAD_ADD: 107, 
		// NUMPAD_ENTER: 108, 
		NUMPAD_SUBTRACT: 109, 
		NUMPAD_DECIMAL: 110, 
		// NUMPAD_DIVIDE: 111, 
		// COMMA: 188, // ','
		SUBTRACT: 189,
		PERIOD: 190  // '.'
    };
    
    /**
	 * 初始化
	 */
	jQuery.fn.limitnumeral.init = function(element, settings) {
	    var self = element;
	    var target = $(element);
	    target.css("ime-mode", "disabled");
	    settings = jQuery.extend({}, jQuery.fn.limitnumeral.defaults, settings);
        jQuery.fn.limitnumeral.settings = settings;
        
        // -- 工具方法  --   
        // 判断是否是数字键
        var isNumberKey = function(key){
			if(key < 48 || key > 105) {
				return false;
			}
			if(key > 57 && key < 96) {
				return false; 
			}
			return true;
        };
        
        // 是否是'.'键
        var isPeriodKey = function(key) {
        	return (key == controlKeyCode['PERIOD']) || (key == controlKeyCode['NUMPAD_DECIMAL']);
        };
        // 是否是'-'键
        var isSubtractKey = function(key) {
        	return (key == controlKeyCode['SUBTRACT']) || (key == controlKeyCode['NUMPAD_SUBTRACT']);
        };
        
        // 是否是需要受控的按键
        var isControlKey = function(key) {
			for(var name in controlKeyCode) { 
				if(controlKeyCode[name] == key) {
					return true; 
				}
			}
			return false;
        };
        
        // 获取当前按下的key
        var getCurrentlyKey = function(event) {
        	event = window.event || event;
            return event.which || event.keyCode;
        }; 
        
        // ----- 事件处理 -----
        var e_keydown = function(event) {
            var key = getCurrentlyKey(event);
            $('#keyCode').text(key + ', settings.isFloat: ' + settings.isFloat);
            if (isControlKey(key)) {
            	
            	// 输入'.'，判断是否支持小数
           		if (isPeriodKey(key)) {
           			// 是否支持小数
	            	if (!settings.isFloat) {
	           			return false;
	           		} else {
	           			// 检查是否已经有小数点，如果有且在第一位取消此次输入
	           			var inputVal = jQuery.trim(target.val());
	           			if (inputVal === '' || inputVal.indexOf('.') != -1) {
	           				return false;
	           			}
	           		}
            	}
            	
            	// 输入'-'，判断是否支持负数
            	if (isSubtractKey(key)) {
            		// 是否支持负数
            		if (!settings.isNegative) {
            			return false;
            		} else {
            			// 检查是否已经有小数点，如果有且在第一位取消此次输入
	           			var inputVal = jQuery.trim(target.val());
	           			if (inputVal != '' || inputVal.indexOf('-') != -1) {
	           				return false;
	           			}
            		}
            	}
            	
            	return;
            }
            if (!isNumberKey(key)) {
            	return false;
            } else {
            	if (event.shiftKey) {
            		return false;
            	}
            }
        };
        
        var e_keyup = function(event) {
            var key = getCurrentlyKey(event);
            var inputVal = jQuery.trim(target.val());
            if (!isPeriodKey(key)) {
            	if (inputVal.indexOf('.') == 0) {
            		target.val(inputVal.replace('.', ''));
            		alert('rep');
            		return;
            	}
            }
            
        	$('#keyUpKeyCode').text(inputVal + '======' + key);
        };
        
        // 绑定获得焦点事件同时绑定keydown事件
        target.bind('focus', function(e) {
        	target.bind('keydown', e_keydown);
        	target.bind('keyup', e_keyup);
        });

		// 绑定失去焦点事件同时取消绑定的keydown事件
        target.bind('blur', function(e) {
            target.unbind('keydown');
            target.unbind('keyup');
        });
        
        // 拖拽内容到输入框事件
        target.bind('dragenter', function(e) {
        	return false;
        });
        
        // 粘贴内容到输入框事件
        target.bind('paste', function() {
            var text = jQuery.trim(clipboardData.getData('text'));
            if (!/\D/.test(text)) {
            	$(this).val(text.replace(/^0*/, ''));
           	}
            return false;
        });
        
        
        // ----- 执行 -----
        
	};
    
})(jQuery);
